import {storage} from "@/utils/Storage";

const Renderer = (window?.require && window?.require('electron')) || window?.electron || {};

/**
 * ipc
 * 官方api说明：https://www.electronjs.org/zh/docs/latest/api/ipc-renderer
 *
 * 属性/方法
 * ipc.invoke(channel, param) - 发送异步消息（invoke/handle 模型）
 * ipc.sendSync(channel, param) - 发送同步消息（send/on 模型）
 * ipc.on(channel, listener) - 监听 channel, 当新消息到达，调用 listener
 * ipc.once(channel, listener) - 添加一次性 listener 函数
 * ipc.removeListener(channel, listener) - 为特定的 channel 从监听队列中删除特定的 listener 监听者
 * ipc.removeAllListeners(channel) - 移除所有的监听器，当指定 channel 时只移除与其相关的所有监听器
 * ipc.send(channel, ...args) - 通过channel向主进程发送异步消息
 * ipc.postMessage(channel, message, [transfer]) - 发送消息到主进程
 * ipc.sendTo(webContentsId, channel, ...args) - 通过 channel 发送消息到带有 webContentsId 的窗口
 * ipc.sendToHost(channel, ...args) - 消息会被发送到 host 页面上的 <webview> 元素
 */

/**
 * ipc
 */
const ipc = Renderer.ipcRenderer || undefined;

/**
 * 是否为EE环境
 */
const isEE = ipc ? true : false;

function ipcGetRootDir() {
  if (isEE) {
    ipc.invoke('controller.framework.getRootDir').then(res => {
      storage.set('root-src', res)
    });
  }
}
function ipcSetWindowSize(data) {
  if (isEE) {
    ipc.invoke('controller.effect.setWindowSize', data);
  }
}
function appRelaunch() {
  if (isEE) {
    ipc.invoke('controller.framework.appRelaunch');
  }
}
function startOtherServer(softName) {
  if (isEE) {
    ipc.invoke('controller.framework.openSoftware', softName);
  }
}
function startApServer() {
  startOtherServer('./TQLAP/TQLAPManagementTool.exe')
}
function startJavaServer() {
  startOtherServer('./AP-Service/ap-server.exe')
}
function saveImageToLocal(name, imageData, width = 280, height = 280) {
  if (isEE) {
    ipc.invoke('controller.framework.saveImageToLocal', {
      name,
      imageData,
      width,
      height,
    });
  }
}
function saveSqliteData(data) {
  if (isEE) {
    ipc.invoke('controller.framework.sqlitedbOperation', data);
  }
}
function actionSqliteData(data) {
  if (isEE) {
    return new Promise((resolve, reject) => {
      ipc.invoke('controller.framework.sqlitedbOperation', data).then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    })
  }
}
export { Renderer, ipc, isEE, ipcGetRootDir, ipcSetWindowSize, startApServer, appRelaunch, startJavaServer, saveImageToLocal, saveSqliteData, actionSqliteData };
